package com.cms.juc;

import java.util.concurrent.TimeUnit;

class Phone {
    public static synchronized void sendEmail() throws InterruptedException {
        TimeUnit.SECONDS.sleep(4);
        System.out.println("发送邮件···");
    }

    public synchronized void sendSMS() throws InterruptedException {
        // TimeUnit.SECONDS.sleep(4);
        System.out.println("发送短信···");
    }

    public void sayHello() {
        System.out.println("Hello···");
    }
}

/**
 * java 里面的八个锁
 * <p>
 * 1. 标准访问
 * 2. 暂停4秒钟
 * 3. 新增sayHello
 */
public class LockDemo {

    public static void main(String[] args) throws InterruptedException {
        Phone phone = new Phone();
        Phone phone2 = new Phone();

        new Thread(() -> {
            try {
                phone.sendEmail();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }, "A").start();

        TimeUnit.SECONDS.sleep(1);

        new Thread(() -> {
            try {
                phone.sendSMS();
                // phone2.sendSMS();
                // phone.sayHello();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }, "B").start();
    }
}

/*
 * 1. 标准访问
 *    两个普通的synchronized方法，没有暂定线程
 *    先邮件，后短信
 * 2. 在一个同步方法里面加上延迟，
 *    结论：只要在一个资源类里面，不管多少个同步方法，只要有任意一个线程访问的资源类里面的任何一个同步方法（synchronized），就会锁上整个资源类。
 *         锁的是对象，其他线程只能等待前一个线程释放锁，[ 只能有一个线程去访问这些同步方法（synchronized）， ]
 * 3. 加一个普通的方法，和同步锁没关系
 * 4. 换成两个对象后，不是同一把锁，各自找自己对应的方法
 * ----------------------------- 以上锁的是this -----------------------------
 * ----------------------------- 以下锁的是Class -----------------------------
 * 5.6. 静态同步（static synchronized）方法
 *    这个锁的是全局锁，锁的是整个Class对象（模板），必须等待某一个释放才能获取锁，不管你是哪个实列
 * 7.8. 一个静态同步（static synchronized）方法，一个同步（synchronized）方法
 *    静态同步（static synchronized）方法获取锁后，对象其他实列的普通同步（synchronized）方法获取的锁并不是同一个（Class锁），并不会冲突，
 *    不会等待静态同步（static synchronized）方法释放锁，
 *
 */























